h1b_df <- DATA
DATA_certificate <- DATA %>%
  filter(case_status == "certified") %>%
  group_by(worksite_state_abb, year) %>%
  summarise(num = n())

DATA_new <-  DATA_certificate %>%
  ungroup(worksite_state_abb) %>%
  mutate(worksite_state_abb = str_to_upper(worksite_state_abb))

d1 <-
  ichoropleth(
    num ~ worksite_state_abb,
    data = DATA_new,
    animate = 'year',
    ncuts = 9,
    legend = FALSE,
    geographyConfig = list(popupTemplate = "#!function(geo, data) {return '<div class=\"hoverinfo\"><strong>' + data.worksite_state_abb + '<br>' + data.num + '</strong></div>';}!#")
  )

d1$save('rMaps.html', cdn = TRUE)
htmltools::includeHTML("rMaps.html")
DATA %>%
  group_by(year, stem) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n, fill = as.factor(stem))) +
  geom_bar(stat = "identity",
           position = position_stack(reverse = FALSE),
           alpha = 0.8) +
  scale_fill_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("non-STEM", "STEM")
  ) +
  labs(y = "\n Number", x = "\n Year") +
  scale_y_continuous(
    labels = function(x) {
      paste0(x / 1000, 'K')
    }
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(legend.position = "top")

DATA %>%
  filter(prevailing_wage >= 0 & prevailing_wage <= 600000) %>%
  ggplot(aes(x = as.factor(year), y = prevailing_wage)) +
  geom_boxplot(
    aes(fill = as.factor(stem)),
    outlier.shape = NA,
    alpha = 0.9,
    color = "white"
  ) +
  theme_minimal() +
  labs(x = "\n Year", y = "Prevailing wage \n") +
  scale_y_continuous(
    labels = function(x) {
      paste0(x / 1000, "K")
    }
  ) +
  scale_color_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("non-STEM", "STEM")
  ) +
  scale_fill_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("non-STEM", "STEM")
  ) +
  coord_cartesian(ylim = c(40000, 100000))

DATA %>%
  filter(year == 2018) %>%
  filter(prevailing_wage >= 0 & prevailing_wage <= 400000) %>%
  ggplot(aes(
    x = prevailing_wage,
    color = as.factor(stem),
    fill = as.factor(stem)
  )) +
  geom_density(adjust = 2, alpha = 0.7) +
  theme_classic() +
  labs(x = "\n Prevailing wage ($)",
       y = expression(Density ~ (10 ^ {
         -3
       })),
       title = "") +
  scale_x_continuous(
    labels = function(x) {
      paste0(x / 1000, 'K')
    }
  ) +
  scale_y_continuous(
    labels = function(x) {
      paste0(x * 1000, "")
    }
  ) +
  scale_color_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("non-STEM", "STEM")
  ) +
  scale_fill_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("non-STEM", "STEM")
  ) +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme_minimal()

dt <- DATA %>%
  mutate(job_title = ifelse(
    str_detect(job_title, "business") &
      (
        str_detect(job_title, "analyst") |
          str_detect(job_title, "intelligence")
      ) ,
    "business analyst",
    job_title
  )) %>%
  mutate(job_title = ifelse(
    str_detect(job_title, "data") &
      (
        str_detect(job_title, "engineer") |
          str_detect(job_title, "warehouse")
      ),
    "data engineer",
    job_title
  )) %>%
  mutate(job_title = ifelse(
    str_detect(job_title, "data") &
      str_detect(job_title, "scientist"),
    "data scientist",
    job_title
  )) %>%
  mutate(job_title = ifelse(
    str_detect(job_title, "data") &
      str_detect(job_title, "analyst|analytics"),
    "data analyst",
    job_title
  )) %>%
  mutate(job_title = ifelse(
    str_detect(job_title, "machine|deep") &
      str_detect(job_title, "learning"),
    "deep learning & machine learning",
    job_title
  )) %>%
  mutate(job_title = ifelse(
    str_detect(job_title, "product") &
      str_detect(job_title, "analyst|engineer|data"),
    "data product analyst",
    job_title
  )) %>%
  mutate(job_title = ifelse(
    str_detect(job_title, "senior systems analyst jc60"),
    "senior systems analyst",
    job_title
  )) %>%
  filter(stem == 1)

dt %>%
  filter(year == 2018) %>%
  group_by(job_title) %>%
  summarise(n = n()) %>%
  arrange(-n) %>%
  slice(1:20) %>%
  mutate(cat = case_when(
    str_detect(job_title, "systems|programmer") ~ "non-data",
    str_detect(job_title, "analyst|data") ~ "data",
    TRUE ~ "non-data"
  )) %>%
  arrange(n) %>% 
  ggbarplot(
    "job_title",
    "n",
    fill = "cat",
    palette = c("#FC2967", "#00B2E4"),
    alpha = 0.8,
    orientation = "horiz",
    color = "white"
  ) +
  labs(y = "Number of Aplications", x = "Job Titles") +
  theme_minimal() +
  theme(legend.position = "none") +
  theme(panel.grid.major.y = element_blank())



# original
dt %>%
  filter(year == 2018) %>%
  group_by(job_title) %>%
  summarise(n = n()) %>%
  arrange(-n) %>%
  slice(1:20) %>%
  arrange(n) %>%
  ggbarplot(
    "job_title",
    "n",
    fill = "#00B2E4",
    alpha = 0.8,
    orientation = "horiz",
    color = "white"
  ) +
  labs(y = "Number of Aplications", x = "Job Titles") +
  theme_minimal() +
  theme(panel.grid.major.y = element_blank())

dt <- DATA %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Engineer",
      "Data Analyst",
      "Data Scientist"
    )
  ) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  arrange(-n)

p1 <- dt %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2)+
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "Applications Data related jobs",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))
p1

filtered_job <- DATA %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Engineer",
      "Data Scientist",
      "Data Analyst"
    )
  )


filtered_job$data_job_title <-
  factor(
    filtered_job$data_job_title,
    levels = c(
      "Data Analyst",
      "Business Analyst",
      "Data Engineer",
      "Data Scientist"
    ),
    ordered = TRUE
  )


#filtered_job %>% group_by(data_job_title) %>% summarise(mean = mean(prevailing_wage))
filtered_job %>%
  ggplot(aes(y = prevailing_wage, x = data_job_title)) +
  geom_boxplot(
    fill = "#00B2E4",
    outlier.shape = NA,
    color = "white",
    width = 0.5
  ) +
  coord_cartesian(ylim = c(50000, 120000)) +
  theme_minimal() +
  labs(x = "\n Job title", y = "Prevailing wage (per year) \n", title = "Prevailing wages in data related jobs") +
  theme(
    plot.title = element_text(size = 1),
    text = element_text(size = 12),
    axis.title = element_text(size = 16),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

top_com <- DATA %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Analyst",
      "Data Engineer",
      "Data Scientist"
    )
  ) %>%
  group_by(employer_name) %>%
  summarise(n = n()) %>%
  arrange(-n) %>%
  slice(1:20) %>%
  ungroup()

top_com <- top_com$employer_name

spa_data <- DATA %>%
  filter(employer_name %in% top_com) %>%
  filter(employer_name != "capgemini america inc") %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Analyst",
      "Data Engineer",
      "Data Scientist"
    )
  ) %>%
  group_by(employer_name, year) %>%
  summarise(n = n())

con = c("infosys limited",
        "deloitte consulting llp",
        "amazon",
        "facebook",
        "ibm")
myColor <- c("#465881", "#FFB6C1", "#00909e", "#00B2E4", "#FC2967")

# c(amazon, "deloitte", "#facebook", "ibm", "info")

ggplot(spa_data, aes(x = year, y = n, group = employer_name)) +
  geom_line(alpha = 0.3,
            size = 0.2) +
  labs(x = "Year",
       y = "Number",
       col = "") +
  theme_classic() +
  geom_line(
    data = subset(spa_data, employer_name %in% con),
    aes(col = employer_name),
    size = 1.2
  ) +
  theme(
    plot.title = element_text(size = 14),
    text = element_text(size = 12),
    axis.title = element_text(face = "bold"),
    axis.text.x = element_text(size = 11)
  ) +
  scale_color_manual(
    values = myColor,
    breaks = c(
      "infosys limited",
      "deloitte consulting llp",
      "amazon",
      "facebook",
      "ibm"
    ),
    labels = c(
      "Infosys Limited",
      "Deloitte Consulting",
      "Amazon",
      "Facebook",
      "IBM"
    )
  )  +
  theme_minimal() +
  theme(legend.position = "right")

soc_top_tech <- c("Apple",
                  "Microsoft",
                  "Amazon",
                  "Facebook",
                  "Google",
                  "IBM")


DATA %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Engineer",
      "Data Analyst",
      "Data Scientist"
    )
  ) %>%
  mutate(employer_name = ifelse(
    str_detect(employer_name, 'apple'),
    'Apple',
    ifelse(
      str_detect(employer_name, 'microsoft'),
      'Microsoft',
      ifelse(
        str_detect(employer_name, 'amazon'),
        'Amazon',
        ifelse(
          str_detect(employer_name, 'facebook'),
          'Facebook',
          ifelse(
            str_detect(employer_name, 'google'),
            'Google',
            ifelse(str_detect(employer_name, 'ibm'), 'IBM', 'no')
          )
        )
      )
    )
  )) %>%
  group_by(employer_name, year) %>%
  summarise(tot = n()) %>%
  filter(!employer_name %in% c("no", NA)) %>%
  ungroup() %>%
  ggplot() +
  scale_color_brewer(palette = "RdBu") +
  geom_line(aes(x = year, y = tot, color = employer_name), size = 1.5) +
  labs(y = "Number of Applications", x = "Year", color = "Employer") +
  theme_minimal()

filtered_job_all <- DATA %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Analyst",
      "Data Engineer",
      "Data Scientist"
    )
  ) %>%
  mutate(employer_name = ifelse(
    str_detect(employer_name, 'apple'),
    'Apple',
    ifelse(
      str_detect(employer_name, 'microsoft'),
      'Microsoft',
      ifelse(
        str_detect(employer_name, 'amazon'),
        'Amazon',
        ifelse(
          str_detect(employer_name, 'facebook'),
          'Facebook',
          ifelse(
            str_detect(employer_name, 'google'),
            'Google',
            ifelse(str_detect(employer_name, 'ibm'), 'IBM', employer_name)
          )
        )
      )
    )
  )) 
  

IBM

h1b_ibm <- h1b_df %>%
  filter(str_detect(employer_name, 'ibm'))

h1b_ibm <- h1b_ibm %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  arrange(-n)
con = c("Business Analyst",
        "Data Engineer",
        "Data Scientist",
        "Data Analyst")
ggplot(h1b_ibm, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3,
            size = 0.2) +
  labs(title = "",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_line(
    data = subset(h1b_ibm, data_job_title %in% con),
    aes(col = data_job_title),
    size = 1.1
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme(
    plot.title = element_text(size = 14, family = "Helvetica"),
    text = element_text(size = 12, family = "Helvetica"),
    #axis.title = element_text(face="bold"),
    axis.text.x = element_text(size = 11),
    legend.position = "none"
  ) +
  coord_cartesian(ylim = c(0, 1000))

filtered_job_all %>%
  filter(employer_name == 'IBM') %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

NA
NA

Infosys


filtered_job_all %>%
  filter(str_detect(employer_name, 'infosys')) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(legend.position = "top") +
  theme(plot.title = element_text(hjust = 0.5))

Accenture

filtered_job_all %>%
  filter(str_detect(employer_name, 'accenture')) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Microsoft

filtered_job_all %>%
  filter(employer_name == 'Microsoft') %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Amazon

filtered_job_all %>%
  filter(employer_name == 'Amazon') %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Deloitte

filtered_job_all %>%
  filter(str_detect(employer_name, "deloitte")) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Facebook

filtered_job_all %>%
  filter(str_detect(employer_name, "Facebook")) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Apple

filtered_job_all %>%
  filter(str_detect(employer_name, "Apple")) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Google

filtered_job_all %>%
  filter(str_detect(employer_name, "Google")) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Data job per state in 2018

DATA_certificate_data <- DATA %>%
  filter(case_status == "certified") %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Engineer",
      "Data Analyst",
      "Data Scientist"
    )
  ) %>%
  group_by(worksite_state_abb, year) %>%
  summarise(num = n())

DATA_new_data <-  DATA_certificate_data %>%
  ungroup(worksite_state_abb) %>%
  mutate(worksite_state_abb = str_to_upper(worksite_state_abb))

d1 <-
  ichoropleth(
    num ~ worksite_state_abb,
    data = DATA_new_data,
    animate = 'year',
    ncuts = 8,
    legend = FALSE,
    geographyConfig = list(popupTemplate = "#!function(geo, data) {return '<div class=\"hoverinfo\"><strong>' + data.worksite_state_abb + '<br>' + data.num + '</strong></div>';}!#")
  )

d1$save('rMaps_data.html', cdn = TRUE)
htmltools::includeHTML("rMaps.html")

Alluvia

filtered_job <- DATA %>%
  filter(year == 2018) %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Analyst",
      "Data Engineer",
      "Data Scientist"
    )
  )


top_10_state <- filtered_job %>%
  group_by(worksite_state_abb) %>%
  summarise(count = n()) %>%
  arrange(desc(count)) %>%
  slice(1:10)

flows <- filtered_job %>%
  filter(worksite_state_abb %in% top_10_state$worksite_state_abb) %>%
  group_by(data_job_title,
           worksite_state_abb) %>%
  summarise(count = n())


ggplot(flows,
       aes(y = count, axis1 = data_job_title, axis2 = worksite_state_abb)) +
  geom_alluvium(aes(fill = data_job_title)) +
  geom_stratum(
    width = 1 / 8,
    fill = "#0F2A48",
    color = "grey",
    alpha = 0.9
  ) +
  geom_label(stat = "stratum", label.strata = TRUE) +
  labs(x = "", y = "") +
  theme_minimal() +
  theme(legend.position = "top") +
  scale_fill_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                    name = NULL) +
  scale_x_discrete(limits = c("Job title", "State"),
                   expand = c(.05, .05)) +
  theme(axis.text.x = element_text(size = 12, face = "bold")) +
  theme(line = element_blank())

MAP - data job with the highest number in each city

ggplot(points) +
  geom_sf(
    data = state_maps,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon, 100),
    y = jitter(lat, 100),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    legend.box = "horizontal",
    legend.position = c(0, -0.1),
    legend.justification = c(0, 0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_ca) +
  geom_sf(
    data = state_maps_ca,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_tx) +
  geom_sf(
    data = state_maps_tx,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_northeast) +
  geom_sf(
    data = state_maps_northeast,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_midwest) +
  geom_sf(
    data = state_maps_midwest,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon, 100),
    y = jitter(lat, 100),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_fl) +
  geom_sf(
    data = state_maps_fl,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_wa) +
  geom_sf(
    data = state_maps_wa,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_tn) +
  geom_sf(
    data = state_maps_tn,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

DATA %>%
  filter(worksite_state_abb == "TN") %>%
  group_by(year, data_relation) %>%
  summarise(n = n()) %>%
  
  ggplot(aes(
    x = year,
    y = n,
    fill = as.factor(data_relation)
  )) +
  geom_bar(stat = "identity",
           position = "dodge",
           alpha = 0.8) +
  scale_fill_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("Data jobs", "Others")
  ) +
  labs(y = "\n Number", x = "\n Year") +
  #scale_y_continuous(labels = function(x){paste0(x/1000, 'K')}) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(legend.position = "top")

LS0tCnRpdGxlOiAiRmluYWxfUmVwb3J0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3IgaW1wb3J0IGRhdGF9CmgxYl9kZiA8LSBEQVRBCmBgYAoKCgpgYGB7ciBhbmltYXRpb24gbWFwIGZvciBhbGwgam9ic30KREFUQV9jZXJ0aWZpY2F0ZSA8LSBEQVRBICU+JQogIGZpbHRlcihjYXNlX3N0YXR1cyA9PSAiY2VydGlmaWVkIikgJT4lCiAgZ3JvdXBfYnkod29ya3NpdGVfc3RhdGVfYWJiLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobnVtID0gbigpKQoKREFUQV9uZXcgPC0gIERBVEFfY2VydGlmaWNhdGUgJT4lCiAgdW5ncm91cCh3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JQogIG11dGF0ZSh3b3Jrc2l0ZV9zdGF0ZV9hYmIgPSBzdHJfdG9fdXBwZXIod29ya3NpdGVfc3RhdGVfYWJiKSkKCmQxIDwtCiAgaWNob3JvcGxldGgoCiAgICBudW0gfiB3b3Jrc2l0ZV9zdGF0ZV9hYmIsCiAgICBkYXRhID0gREFUQV9uZXcsCiAgICBhbmltYXRlID0gJ3llYXInLAogICAgbmN1dHMgPSA5LAogICAgbGVnZW5kID0gRkFMU0UsCiAgICBnZW9ncmFwaHlDb25maWcgPSBsaXN0KHBvcHVwVGVtcGxhdGUgPSAiIyFmdW5jdGlvbihnZW8sIGRhdGEpIHtyZXR1cm4gJzxkaXYgY2xhc3M9XCJob3ZlcmluZm9cIj48c3Ryb25nPicgKyBkYXRhLndvcmtzaXRlX3N0YXRlX2FiYiArICc8YnI+JyArIGRhdGEubnVtICsgJzwvc3Ryb25nPjwvZGl2Pic7fSEjIikKICApCgpkMSRzYXZlKCdyTWFwcy5odG1sJywgY2RuID0gVFJVRSkKYGBgCgpgYGB7ciBzaG93IGFuaW1hdGlvbiBtYXB9Cmh0bWx0b29sczo6aW5jbHVkZUhUTUwoInJNYXBzLmh0bWwiKQpgYGAKCgpgYGB7ciBzdGVtLW5vbnN0ZW0gYmFyIGNoYXJ0LCBmaWcuaGVpZ2h0PTIuNiwgZmlnLndpZHRoPTIuM30KREFUQSAlPiUKICBncm91cF9ieSh5ZWFyLCBzdGVtKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4sIGZpbGwgPSBhcy5mYWN0b3Ioc3RlbSkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsCiAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayhyZXZlcnNlID0gRkFMU0UpLAogICAgICAgICAgIGFscGhhID0gMC44KSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwKICAgIG5hbWUgPSAiIiwKICAgIGxhYmVscyA9IGMoIm5vbi1TVEVNIiwgIlNURU0iKQogICkgKwogIGxhYnMoeSA9ICJcbiBOdW1iZXIiLCB4ID0gIlxuIFllYXIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gZnVuY3Rpb24oeCkgewogICAgICBwYXN0ZTAoeCAvIDEwMDAsICdLJykKICAgIH0KICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKCmBgYHtyIFByZXZhaWxpbmcgd2FnZSBvZiBzdGVtLW5vbnN0ZW0gYm94cGxvdH0KREFUQSAlPiUKICBmaWx0ZXIocHJldmFpbGluZ193YWdlID49IDAgJiBwcmV2YWlsaW5nX3dhZ2UgPD0gNjAwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhcy5mYWN0b3IoeWVhciksIHkgPSBwcmV2YWlsaW5nX3dhZ2UpKSArCiAgZ2VvbV9ib3hwbG90KAogICAgYWVzKGZpbGwgPSBhcy5mYWN0b3Ioc3RlbSkpLAogICAgb3V0bGllci5zaGFwZSA9IE5BLAogICAgYWxwaGEgPSAwLjksCiAgICBjb2xvciA9ICJ3aGl0ZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoeCA9ICJcbiBZZWFyIiwgeSA9ICJQcmV2YWlsaW5nIHdhZ2UgXG4iKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gZnVuY3Rpb24oeCkgewogICAgICBwYXN0ZTAoeCAvIDEwMDAsICJLIikKICAgIH0KICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwKICAgIG5hbWUgPSAiIiwKICAgIGxhYmVscyA9IGMoIm5vbi1TVEVNIiwgIlNURU0iKQogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksCiAgICBuYW1lID0gIiIsCiAgICBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikKICApICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoNDAwMDAsIDEwMDAwMCkpCmBgYAoKCmBgYHtyIHByZXZhaWxpbmcgd2FnZSBkZW5zaXR5IGluIDIwMTh9CkRBVEEgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lCiAgZmlsdGVyKHByZXZhaWxpbmdfd2FnZSA+PSAwICYgcHJldmFpbGluZ193YWdlIDw9IDQwMDAwMCkgJT4lCiAgZ2dwbG90KGFlcygKICAgIHggPSBwcmV2YWlsaW5nX3dhZ2UsCiAgICBjb2xvciA9IGFzLmZhY3RvcihzdGVtKSwKICAgIGZpbGwgPSBhcy5mYWN0b3Ioc3RlbSkKICApKSArCiAgZ2VvbV9kZW5zaXR5KGFkanVzdCA9IDIsIGFscGhhID0gMC43KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHggPSAiXG4gUHJldmFpbGluZyB3YWdlICgkKSIsCiAgICAgICB5ID0gZXhwcmVzc2lvbihEZW5zaXR5IH4gKDEwIF4gewogICAgICAgICAtMwogICAgICAgfSkpLAogICAgICAgdGl0bGUgPSAiIikgKwogIHNjYWxlX3hfY29udGludW91cygKICAgIGxhYmVscyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgcGFzdGUwKHggLyAxMDAwLCAnSycpCiAgICB9CiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gZnVuY3Rpb24oeCkgewogICAgICBwYXN0ZTAoeCAqIDEwMDAsICIiKQogICAgfQogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIiMwMEIyRTQiLCAiIzBGMkE0OCIpLAogICAgbmFtZSA9ICIiLAogICAgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwKICAgIG5hbWUgPSAiIiwKICAgIGxhYmVscyA9IGMoIm5vbi1TVEVNIiwgIlNURU0iKQogICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCmBgYHtyIHN0ZW0gam9icyBiYXJzfQpkdCA8LSBEQVRBICU+JQogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImJ1c2luZXNzIikgJgogICAgICAoCiAgICAgICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0IikgfAogICAgICAgICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJpbnRlbGxpZ2VuY2UiKQogICAgICApICwKICAgICJidXNpbmVzcyBhbmFseXN0IiwKICAgIGpvYl90aXRsZQogICkpICU+JQogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSAmCiAgICAgICgKICAgICAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImVuZ2luZWVyIikgfAogICAgICAgICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJ3YXJlaG91c2UiKQogICAgICApLAogICAgImRhdGEgZW5naW5lZXIiLAogICAgam9iX3RpdGxlCiAgKSkgJT4lCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZSgKICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpICYKICAgICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJzY2llbnRpc3QiKSwKICAgICJkYXRhIHNjaWVudGlzdCIsCiAgICBqb2JfdGl0bGUKICApKSAlPiUKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKAogICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikgJgogICAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8YW5hbHl0aWNzIiksCiAgICAiZGF0YSBhbmFseXN0IiwKICAgIGpvYl90aXRsZQogICkpICU+JQogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgIm1hY2hpbmV8ZGVlcCIpICYKICAgICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJsZWFybmluZyIpLAogICAgImRlZXAgbGVhcm5pbmcgJiBtYWNoaW5lIGxlYXJuaW5nIiwKICAgIGpvYl90aXRsZQogICkpICU+JQogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInByb2R1Y3QiKSAmCiAgICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxlbmdpbmVlcnxkYXRhIiksCiAgICAiZGF0YSBwcm9kdWN0IGFuYWx5c3QiLAogICAgam9iX3RpdGxlCiAgKSkgJT4lCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZSgKICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAic2VuaW9yIHN5c3RlbXMgYW5hbHlzdCBqYzYwIiksCiAgICAic2VuaW9yIHN5c3RlbXMgYW5hbHlzdCIsCiAgICBqb2JfdGl0bGUKICApKSAlPiUKICBmaWx0ZXIoc3RlbSA9PSAxKQoKZHQgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lCiAgZ3JvdXBfYnkoam9iX3RpdGxlKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgYXJyYW5nZSgtbikgJT4lCiAgc2xpY2UoMToyMCkgJT4lCiAgbXV0YXRlKGNhdCA9IGNhc2Vfd2hlbigKICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAic3lzdGVtc3xwcm9ncmFtbWVyIikgfiAibm9uLWRhdGEiLAogICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGRhdGEiKSB+ICJkYXRhIiwKICAgIFRSVUUgfiAibm9uLWRhdGEiCiAgKSkgJT4lCiAgYXJyYW5nZShuKSAlPiUgCiAgZ2diYXJwbG90KAogICAgImpvYl90aXRsZSIsCiAgICAibiIsCiAgICBmaWxsID0gImNhdCIsCiAgICBwYWxldHRlID0gYygiI0ZDMjk2NyIsICIjMDBCMkU0IiksCiAgICBhbHBoYSA9IDAuOCwKICAgIG9yaWVudGF0aW9uID0gImhvcml6IiwKICAgIGNvbG9yID0gIndoaXRlIgogICkgKwogIGxhYnMoeSA9ICJOdW1iZXIgb2YgQXBsaWNhdGlvbnMiLCB4ID0gIkpvYiBUaXRsZXMiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCgoKIyBvcmlnaW5hbApkdCAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUKICBncm91cF9ieShqb2JfdGl0bGUpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKSAlPiUKICBzbGljZSgxOjIwKSAlPiUKICBhcnJhbmdlKG4pICU+JQogIGdnYmFycGxvdCgKICAgICJqb2JfdGl0bGUiLAogICAgIm4iLAogICAgZmlsbCA9ICIjMDBCMkU0IiwKICAgIGFscGhhID0gMC44LAogICAgb3JpZW50YXRpb24gPSAiaG9yaXoiLAogICAgY29sb3IgPSAid2hpdGUiCiAgKSArCiAgbGFicyh5ID0gIk51bWJlciBvZiBBcGxpY2F0aW9ucyIsIHggPSAiSm9iIFRpdGxlcyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKYGBge3IgZGF0YSBqb2JzIG51bWJlciBwZXIgeWVhcixmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00fQpkdCA8LSBEQVRBICU+JQogIGZpbHRlcigKICAgIGRhdGFfam9iX3RpdGxlICVpbiUgYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICJEYXRhIEFuYWx5c3QiLAogICAgICAiRGF0YSBTY2llbnRpc3QiCiAgICApCiAgKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGFycmFuZ2UoLW4pCgpwMSA8LSBkdCAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMS4yKSArCiAgbGFicygKICAgIHkgPSAiIiwKICAgIHggPSAiWWVhciIsCiAgICB0aXRsZSA9ICJBcHBsaWNhdGlvbnMgRGF0YSByZWxhdGVkIGpvYnMiLAogICAgZmFjZSA9ICJib2xkIiwKICAgIHNpemUgPSAxNAogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKcDEKYGBgCgoKYGBge3IgZGF0YSBqb2Igc2FsYXJ5IGJveHBsb3R9CmZpbHRlcmVkX2pvYiA8LSBEQVRBICU+JQogIGZpbHRlcigKICAgIGRhdGFfam9iX3RpdGxlICVpbiUgYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIsCiAgICAgICJEYXRhIEFuYWx5c3QiCiAgICApCiAgKQoKCmZpbHRlcmVkX2pvYiRkYXRhX2pvYl90aXRsZSA8LQogIGZhY3RvcigKICAgIGZpbHRlcmVkX2pvYiRkYXRhX2pvYl90aXRsZSwKICAgIGxldmVscyA9IGMoCiAgICAgICJEYXRhIEFuYWx5c3QiLAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKSwKICAgIG9yZGVyZWQgPSBUUlVFCiAgKQoKCiNmaWx0ZXJlZF9qb2IgJT4lIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHByZXZhaWxpbmdfd2FnZSkpCmZpbHRlcmVkX2pvYiAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBwcmV2YWlsaW5nX3dhZ2UsIHggPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2JveHBsb3QoCiAgICBmaWxsID0gIiMwMEIyRTQiLAogICAgb3V0bGllci5zaGFwZSA9IE5BLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgd2lkdGggPSAwLjUKICApICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoNTAwMDAsIDEyMDAwMCkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoeCA9ICJcbiBKb2IgdGl0bGUiLCB5ID0gIlByZXZhaWxpbmcgd2FnZSAocGVyIHllYXIpIFxuIiwgdGl0bGUgPSAiUHJldmFpbGluZyB3YWdlcyBpbiBkYXRhIHJlbGF0ZWQgam9icyIpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEpLAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKYGBge3IgZGF0YSBqb2JzIGluIHRvcCBjb21wYW5pZXMgcGVyIHllYXJ9CnRvcF9jb20gPC0gREFUQSAlPiUKICBmaWx0ZXIoCiAgICBkYXRhX2pvYl90aXRsZSAlaW4lIGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKQogICkgJT4lCiAgZ3JvdXBfYnkoZW1wbG95ZXJfbmFtZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGFycmFuZ2UoLW4pICU+JQogIHNsaWNlKDE6MjApICU+JQogIHVuZ3JvdXAoKQoKdG9wX2NvbSA8LSB0b3BfY29tJGVtcGxveWVyX25hbWUKCnNwYV9kYXRhIDwtIERBVEEgJT4lCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgJWluJSB0b3BfY29tKSAlPiUKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSAhPSAiY2FwZ2VtaW5pIGFtZXJpY2EgaW5jIikgJT4lCiAgZmlsdGVyKAogICAgZGF0YV9qb2JfdGl0bGUgJWluJSBjKAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIsCiAgICAgICJEYXRhIEFuYWx5c3QiLAogICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIKICAgICkKICApICU+JQogIGdyb3VwX2J5KGVtcGxveWVyX25hbWUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKQoKY29uID0gYygiaW5mb3N5cyBsaW1pdGVkIiwKICAgICAgICAiZGVsb2l0dGUgY29uc3VsdGluZyBsbHAiLAogICAgICAgICJhbWF6b24iLAogICAgICAgICJmYWNlYm9vayIsCiAgICAgICAgImlibSIpCm15Q29sb3IgPC0gYygiIzQ2NTg4MSIsICIjRkZCNkMxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIsICIjRkMyOTY3IikKCiMgYyhhbWF6b24sICJkZWxvaXR0ZSIsICIjZmFjZWJvb2siLCAiaWJtIiwgImluZm8iKQoKZ2dwbG90KHNwYV9kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGVtcGxveWVyX25hbWUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gIiIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21fbGluZSgKICAgIGRhdGEgPSBzdWJzZXQoc3BhX2RhdGEsIGVtcGxveWVyX25hbWUgJWluJSBjb24pLAogICAgYWVzKGNvbCA9IGVtcGxveWVyX25hbWUpLAogICAgc2l6ZSA9IDEuMgogICkgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBteUNvbG9yLAogICAgYnJlYWtzID0gYygKICAgICAgImluZm9zeXMgbGltaXRlZCIsCiAgICAgICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsCiAgICAgICJhbWF6b24iLAogICAgICAiZmFjZWJvb2siLAogICAgICAiaWJtIgogICAgKSwKICAgIGxhYmVscyA9IGMoCiAgICAgICJJbmZvc3lzIExpbWl0ZWQiLAogICAgICAiRGVsb2l0dGUgQ29uc3VsdGluZyIsCiAgICAgICJBbWF6b24iLAogICAgICAiRmFjZWJvb2siLAogICAgICAiSUJNIgogICAgKQogICkgICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpgYGAKCgoKCmBgYHtyIGRhdGEgam9iIG51bSBpbiB0b3AgdGVjaCBwZXIgeWVhcn0Kc29jX3RvcF90ZWNoIDwtIGMoIkFwcGxlIiwKICAgICAgICAgICAgICAgICAgIk1pY3Jvc29mdCIsCiAgICAgICAgICAgICAgICAgICJBbWF6b24iLAogICAgICAgICAgICAgICAgICAiRmFjZWJvb2siLAogICAgICAgICAgICAgICAgICAiR29vZ2xlIiwKICAgICAgICAgICAgICAgICAgIklCTSIpCgoKREFUQSAlPiUKICBmaWx0ZXIoCiAgICBkYXRhX2pvYl90aXRsZSAlaW4lIGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgIkRhdGEgRW5naW5lZXIiLAogICAgICAiRGF0YSBBbmFseXN0IiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKQogICkgJT4lCiAgbXV0YXRlKGVtcGxveWVyX25hbWUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdhcHBsZScpLAogICAgJ0FwcGxlJywKICAgIGlmZWxzZSgKICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnbWljcm9zb2Z0JyksCiAgICAgICdNaWNyb3NvZnQnLAogICAgICBpZmVsc2UoCiAgICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnYW1hem9uJyksCiAgICAgICAgJ0FtYXpvbicsCiAgICAgICAgaWZlbHNlKAogICAgICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnZmFjZWJvb2snKSwKICAgICAgICAgICdGYWNlYm9vaycsCiAgICAgICAgICBpZmVsc2UoCiAgICAgICAgICAgIHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2dvb2dsZScpLAogICAgICAgICAgICAnR29vZ2xlJywKICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2libScpLCAnSUJNJywgJ25vJykKICAgICAgICAgICkKICAgICAgICApCiAgICAgICkKICAgICkKICApKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UodG90ID0gbigpKSAlPiUKICBmaWx0ZXIoIWVtcGxveWVyX25hbWUgJWluJSBjKCJubyIsIE5BKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGdncGxvdCgpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJSZEJ1IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSB0b3QsIGNvbG9yID0gZW1wbG95ZXJfbmFtZSksIHNpemUgPSAxLjUpICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwcGxpY2F0aW9ucyIsIHggPSAiWWVhciIsIGNvbG9yID0gIkVtcGxveWVyIikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoKCmBgYHtyIGNsZWFuIG5hbWVzIGZvciB0ZWNoIGNvbXBhbmllc30KZmlsdGVyZWRfam9iX2FsbCA8LSBEQVRBICU+JQogIGZpbHRlcigKICAgIGRhdGFfam9iX3RpdGxlICVpbiUgYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAiRGF0YSBBbmFseXN0IiwKICAgICAgIkRhdGEgRW5naW5lZXIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiCiAgICApCiAgKSAlPiUKICBtdXRhdGUoZW1wbG95ZXJfbmFtZSA9IGlmZWxzZSgKICAgIHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2FwcGxlJyksCiAgICAnQXBwbGUnLAogICAgaWZlbHNlKAogICAgICBzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdtaWNyb3NvZnQnKSwKICAgICAgJ01pY3Jvc29mdCcsCiAgICAgIGlmZWxzZSgKICAgICAgICBzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdhbWF6b24nKSwKICAgICAgICAnQW1hem9uJywKICAgICAgICBpZmVsc2UoCiAgICAgICAgICBzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdmYWNlYm9vaycpLAogICAgICAgICAgJ0ZhY2Vib29rJywKICAgICAgICAgIGlmZWxzZSgKICAgICAgICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnZ29vZ2xlJyksCiAgICAgICAgICAgICdHb29nbGUnLAogICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaWJtJyksICdJQk0nLCBlbXBsb3llcl9uYW1lKQogICAgICAgICAgKQogICAgICAgICkKICAgICAgKQogICAgKQogICkpIAogIApgYGAKCgojIyBJQk0gCgpgYGB7ciBwcmVwIGZvciBJQk19CmgxYl9pYm0gPC0gaDFiX2RmICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdpYm0nKSkKCmgxYl9pYm0gPC0gaDFiX2libSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGFycmFuZ2UoLW4pCmBgYAoKYGBge3IgYWxsIGpvYnMgaW4gSUJNIHBlciB5ZWFyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0yLjV9CmNvbiA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAgICJEYXRhIEVuZ2luZWVyIiwKICAgICAgICAiRGF0YSBTY2llbnRpc3QiLAogICAgICAgICJEYXRhIEFuYWx5c3QiKQpnZ3Bsb3QoaDFiX2libSwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIiIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgZ2VvbV9saW5lKAogICAgZGF0YSA9IHN1YnNldChoMWJfaWJtLCBkYXRhX2pvYl90aXRsZSAlaW4lIGNvbiksCiAgICBhZXMoY29sID0gZGF0YV9qb2JfdGl0bGUpLAogICAgc2l6ZSA9IDEuMQogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiKSwKICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAjYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiCiAgKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEwMDApKQpgYGAKCgoKYGBge3IgZGF0YSBqb2JzIGluIElCTSBwZXIgeWVhcn0KZmlsdGVyZWRfam9iX2FsbCAlPiUKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnSUJNJykgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgoKYGBgCgojIEluZm9zeXMKYGBge3IgZGF0YSBqb2JzIGluIEluZm9zeXMgcGVyIHllYXJ9CgpmaWx0ZXJlZF9qb2JfYWxsICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdpbmZvc3lzJykpICU+JQogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSArCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAxLjIpICsKICBsYWJzKAogICAgeSA9ICIiLAogICAgeCA9ICJZZWFyIiwKICAgIHRpdGxlID0gIiIsCiAgICBmYWNlID0gImJvbGQiLAogICAgc2l6ZSA9IDE0CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGQzI5NjciLCAiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQoKYGBgCgojIEFjY2VudHVyZQpgYGB7ciBkYXRhIGpvYnMgaW4gQWNjZW50dXJlIHBlciB5ZWFyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdhY2NlbnR1cmUnKSkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKCiMgTWljcm9zb2Z0CmBgYHtyIGRhdGEgam9icyBpbiBNaWNyb3NvZnQgcGVyIHllYXJ9CmZpbHRlcmVkX2pvYl9hbGwgJT4lCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgPT0gJ01pY3Jvc29mdCcpICU+JQogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSArCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAxLjIpICsKICBsYWJzKAogICAgeSA9ICIiLAogICAgeCA9ICJZZWFyIiwKICAgIHRpdGxlID0gIiIsCiAgICBmYWNlID0gImJvbGQiLAogICAgc2l6ZSA9IDE0CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGQzI5NjciLCAiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCiMgQW1hem9uCmBgYHtyIGRhdGEgam9icyBpbiBBbWF6b24gcGVyIHllYXJ9CmZpbHRlcmVkX2pvYl9hbGwgJT4lCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgPT0gJ0FtYXpvbicpICU+JQogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSArCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAxLjIpICsKICBsYWJzKAogICAgeSA9ICIiLAogICAgeCA9ICJZZWFyIiwKICAgIHRpdGxlID0gIiIsCiAgICBmYWNlID0gImJvbGQiLAogICAgc2l6ZSA9IDE0CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGQzI5NjciLCAiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCiMgRGVsb2l0dGUKYGBge3IgZGF0YSBqb2JzIGluIERlbG9pdHRlIHBlciB5ZWFyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJkZWxvaXR0ZSIpKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkgKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMS4yKSArCiAgbGFicygKICAgIHkgPSAiIiwKICAgIHggPSAiWWVhciIsCiAgICB0aXRsZSA9ICIiLAogICAgZmFjZSA9ICJib2xkIiwKICAgIHNpemUgPSAxNAogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIEZhY2Vib29rCmBgYHtyIGRhdGEgam9icyBpbiBGYWNlYm9vayBwZXIgeWVhcn0KZmlsdGVyZWRfam9iX2FsbCAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAiRmFjZWJvb2siKSkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKIyBBcHBsZQpgYGB7ciBkYXRhIGpvYnMgaW4gQXBwbGUgcGVyIHllYXJ9CmZpbHRlcmVkX2pvYl9hbGwgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgIkFwcGxlIikpICU+JQogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSArCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAxLjIpICsKICBsYWJzKAogICAgeSA9ICIiLAogICAgeCA9ICJZZWFyIiwKICAgIHRpdGxlID0gIiIsCiAgICBmYWNlID0gImJvbGQiLAogICAgc2l6ZSA9IDE0CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGQzI5NjciLCAiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCiMgR29vZ2xlCmBgYHtyIGRhdGEgam9icyBpbiBHb29nbGUgcGVyIHllYXJ9CmZpbHRlcmVkX2pvYl9hbGwgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgIkdvb2dsZSIpKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkgKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMS4yKSArCiAgbGFicygKICAgIHkgPSAiIiwKICAgIHggPSAiWWVhciIsCiAgICB0aXRsZSA9ICIiLAogICAgZmFjZSA9ICJib2xkIiwKICAgIHNpemUgPSAxNAogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKCgoKIyBEYXRhIGpvYiBwZXIgc3RhdGUgaW4gMjAxOAoKYGBge3IgYW5pbWF0aW9uIG1hcCBmb3IgZGF0YSBqb2JzfQpEQVRBX2NlcnRpZmljYXRlX2RhdGEgPC0gREFUQSAlPiUKICBmaWx0ZXIoY2FzZV9zdGF0dXMgPT0gImNlcnRpZmllZCIpICU+JQogIGZpbHRlcigKICAgIGRhdGFfam9iX3RpdGxlICVpbiUgYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICJEYXRhIEFuYWx5c3QiLAogICAgICAiRGF0YSBTY2llbnRpc3QiCiAgICApCiAgKSAlPiUKICBncm91cF9ieSh3b3Jrc2l0ZV9zdGF0ZV9hYmIsIHllYXIpICU+JQogIHN1bW1hcmlzZShudW0gPSBuKCkpCgpEQVRBX25ld19kYXRhIDwtICBEQVRBX2NlcnRpZmljYXRlX2RhdGEgJT4lCiAgdW5ncm91cCh3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JQogIG11dGF0ZSh3b3Jrc2l0ZV9zdGF0ZV9hYmIgPSBzdHJfdG9fdXBwZXIod29ya3NpdGVfc3RhdGVfYWJiKSkKCmQxIDwtCiAgaWNob3JvcGxldGgoCiAgICBudW0gfiB3b3Jrc2l0ZV9zdGF0ZV9hYmIsCiAgICBkYXRhID0gREFUQV9uZXdfZGF0YSwKICAgIGFuaW1hdGUgPSAneWVhcicsCiAgICBuY3V0cyA9IDgsCiAgICBsZWdlbmQgPSBGQUxTRSwKICAgIGdlb2dyYXBoeUNvbmZpZyA9IGxpc3QocG9wdXBUZW1wbGF0ZSA9ICIjIWZ1bmN0aW9uKGdlbywgZGF0YSkge3JldHVybiAnPGRpdiBjbGFzcz1cImhvdmVyaW5mb1wiPjxzdHJvbmc+JyArIGRhdGEud29ya3NpdGVfc3RhdGVfYWJiICsgJzxicj4nICsgZGF0YS5udW0gKyAnPC9zdHJvbmc+PC9kaXY+Jzt9ISMiKQogICkKCmQxJHNhdmUoJ3JNYXBzX2RhdGEuaHRtbCcsIGNkbiA9IFRSVUUpCmBgYAoKYGBge3Igc2hvdyBhbmltYXRpb24gbWFwIGZvciBkYXRhIGpvYnN9Cmh0bWx0b29sczo6aW5jbHVkZUhUTUwoInJNYXBzLmh0bWwiKQpgYGAKCgojIyBBbGx1dmlhCmBgYHtyIGRhdGEgam9icyBhbGx1dmlhIGZvciB0b3Agc3RhdGVzLGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTIuN30KZmlsdGVyZWRfam9iIDwtIERBVEEgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lCiAgZmlsdGVyKAogICAgZGF0YV9qb2JfdGl0bGUgJWluJSBjKAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIsCiAgICAgICJEYXRhIEFuYWx5c3QiLAogICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIKICAgICkKICApCgoKdG9wXzEwX3N0YXRlIDwtIGZpbHRlcmVkX2pvYiAlPiUKICBncm91cF9ieSh3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lCiAgYXJyYW5nZShkZXNjKGNvdW50KSkgJT4lCiAgc2xpY2UoMToxMCkKCmZsb3dzIDwtIGZpbHRlcmVkX2pvYiAlPiUKICBmaWx0ZXIod29ya3NpdGVfc3RhdGVfYWJiICVpbiUgdG9wXzEwX3N0YXRlJHdvcmtzaXRlX3N0YXRlX2FiYikgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsCiAgICAgICAgICAgd29ya3NpdGVfc3RhdGVfYWJiKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpCgoKZ2dwbG90KGZsb3dzLAogICAgICAgYWVzKHkgPSBjb3VudCwgYXhpczEgPSBkYXRhX2pvYl90aXRsZSwgYXhpczIgPSB3b3Jrc2l0ZV9zdGF0ZV9hYmIpKSArCiAgZ2VvbV9hbGx1dml1bShhZXMoZmlsbCA9IGRhdGFfam9iX3RpdGxlKSkgKwogIGdlb21fc3RyYXR1bSgKICAgIHdpZHRoID0gMSAvIDgsCiAgICBmaWxsID0gIiMwRjJBNDgiLAogICAgY29sb3IgPSAiZ3JleSIsCiAgICBhbHBoYSA9IDAuOQogICkgKwogIGdlb21fbGFiZWwoc3RhdCA9ICJzdHJhdHVtIiwgbGFiZWwuc3RyYXRhID0gVFJVRSkgKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJKb2IgdGl0bGUiLCAiU3RhdGUiKSwKICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoLjA1LCAuMDUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSkgKwogIHRoZW1lKGxpbmUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKCgojIE1BUCAtIGRhdGEgam9iIHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIGluIGVhY2ggY2l0eSAKYGBge3IgZGF0YSBjaXR5IFVTIG1hcH0KZ2dwbG90KHBvaW50cykgKwogIGdlb21fc2YoCiAgICBkYXRhID0gc3RhdGVfbWFwcywKICAgIGNvbG9yID0gIndoaXRlIiwKICAgIGZpbGwgPSAibGlnaHRncmV5IiwKICAgIGFscGhhID0gMC41CiAgKSArCiAgZ2VvbV9wb2ludChhZXMoCiAgICB4ID0gaml0dGVyKGxvbiwgMTAwKSwKICAgIHkgPSBqaXR0ZXIobGF0LCAxMDApLAogICAgY29sb3IgPSBtYXhfam9iLAogICAgc2l6ZSA9IG1heAogICksIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLAogICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciCiAgICApLAogICAgbmFtZSA9ICJKb2IgVGl0bGUiCiAgKSArCiAgdGhlbWUoCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJveCA9ICJob3Jpem9udGFsIiwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMCwgLTAuMSksCiAgICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMCkKICApICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHRpdGxlID0gIiIsCiAgICAgICBzaXplID0gIk51bWJlciIpCmBgYAoKYGBge3IgZGF0YSBjaXR5IENBIG1hcH0KZ2dwbG90KHBvaW50c19jYSkgKwogIGdlb21fc2YoCiAgICBkYXRhID0gc3RhdGVfbWFwc19jYSwKICAgIGNvbG9yID0gIndoaXRlIiwKICAgIGZpbGwgPSAibGlnaHRncmV5IiwKICAgIGFscGhhID0gMC41CiAgKSArCiAgZ2VvbV9wb2ludChhZXMoCiAgICB4ID0gaml0dGVyKGxvbiksCiAgICB5ID0gaml0dGVyKGxhdCksCiAgICBjb2xvciA9IG1heF9qb2IsCiAgICBzaXplID0gbWF4CiAgKSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsCiAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIKICAgICksCiAgICBuYW1lID0gIkpvYiBUaXRsZSIKICApICsKICB0aGVtZSgKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICkgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICIiLAogICAgICAgdGl0bGUgPSAiIiwKICAgICAgIHNpemUgPSAiTnVtYmVyIikKYGBgCgpgYGB7ciBkYXRhIGNpdHkgVFggbWFwfQpnZ3Bsb3QocG9pbnRzX3R4KSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBzdGF0ZV9tYXBzX3R4LAogICAgY29sb3IgPSAid2hpdGUiLAogICAgZmlsbCA9ICJsaWdodGdyZXkiLAogICAgYWxwaGEgPSAwLjUKICApICsKICBnZW9tX3BvaW50KGFlcygKICAgIHggPSBqaXR0ZXIobG9uKSwKICAgIHkgPSBqaXR0ZXIobGF0KSwKICAgIGNvbG9yID0gbWF4X2pvYiwKICAgIHNpemUgPSBtYXgKICApLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IgogICAgKSwKICAgIG5hbWUgPSAiSm9iIFRpdGxlIgogICkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICIiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIiKQpgYGAKCmBgYHtyIGRhdGEgY2l0eSBOb3J0aGVhc3Rlcm4gbWFwfQpnZ3Bsb3QocG9pbnRzX25vcnRoZWFzdCkgKwogIGdlb21fc2YoCiAgICBkYXRhID0gc3RhdGVfbWFwc19ub3J0aGVhc3QsCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBmaWxsID0gImxpZ2h0Z3JleSIsCiAgICBhbHBoYSA9IDAuNQogICkgKwogIGdlb21fcG9pbnQoYWVzKAogICAgeCA9IGppdHRlcihsb24pLAogICAgeSA9IGppdHRlcihsYXQpLAogICAgY29sb3IgPSBtYXhfam9iLAogICAgc2l6ZSA9IG1heAogICksIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLAogICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciCiAgICApLAogICAgbmFtZSA9ICJKb2IgVGl0bGUiCiAgKSArCiAgdGhlbWUoCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICApICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHRpdGxlID0gIiIsCiAgICAgICBzaXplID0gIk51bWJlciIpCmBgYAoKYGBge3IgZGF0YSBjaXR5IE1pZHdlc3Rlcm4gbWFwfQpnZ3Bsb3QocG9pbnRzX21pZHdlc3QpICsKICBnZW9tX3NmKAogICAgZGF0YSA9IHN0YXRlX21hcHNfbWlkd2VzdCwKICAgIGNvbG9yID0gIndoaXRlIiwKICAgIGZpbGwgPSAibGlnaHRncmV5IiwKICAgIGFscGhhID0gMC41CiAgKSArCiAgZ2VvbV9wb2ludChhZXMoCiAgICB4ID0gaml0dGVyKGxvbiwgMTAwKSwKICAgIHkgPSBqaXR0ZXIobGF0LCAxMDApLAogICAgY29sb3IgPSBtYXhfam9iLAogICAgc2l6ZSA9IG1heAogICksIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLAogICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciCiAgICApLAogICAgbmFtZSA9ICJKb2IgVGl0bGUiCiAgKSArCiAgdGhlbWUoCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICApICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHRpdGxlID0gIiIsCiAgICAgICBzaXplID0gIk51bWJlciIpCmBgYAoKCmBgYHtyIGRhdGEgY2l0eSBGTCZHQSBtYXB9CmdncGxvdChwb2ludHNfZmwpICsKICBnZW9tX3NmKAogICAgZGF0YSA9IHN0YXRlX21hcHNfZmwsCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBmaWxsID0gImxpZ2h0Z3JleSIsCiAgICBhbHBoYSA9IDAuNQogICkgKwogIGdlb21fcG9pbnQoYWVzKAogICAgeCA9IGppdHRlcihsb24pLAogICAgeSA9IGppdHRlcihsYXQpLAogICAgY29sb3IgPSBtYXhfam9iLAogICAgc2l6ZSA9IG1heAogICksIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLAogICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciCiAgICApLAogICAgbmFtZSA9ICJKb2IgVGl0bGUiCiAgKSArCiAgdGhlbWUoCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICApICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHRpdGxlID0gIiIsCiAgICAgICBzaXplID0gIk51bWJlciIpCmBgYAoKYGBge3IgZGF0YSBjaXR5IFdBIG1hcH0KZ2dwbG90KHBvaW50c193YSkgKwogIGdlb21fc2YoCiAgICBkYXRhID0gc3RhdGVfbWFwc193YSwKICAgIGNvbG9yID0gIndoaXRlIiwKICAgIGZpbGwgPSAibGlnaHRncmV5IiwKICAgIGFscGhhID0gMC41CiAgKSArCiAgZ2VvbV9wb2ludChhZXMoCiAgICB4ID0gaml0dGVyKGxvbiksCiAgICB5ID0gaml0dGVyKGxhdCksCiAgICBjb2xvciA9IG1heF9qb2IsCiAgICBzaXplID0gbWF4CiAgKSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsCiAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIKICAgICksCiAgICBuYW1lID0gIkpvYiBUaXRsZSIKICApICsKICB0aGVtZSgKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICkgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICIiLAogICAgICAgdGl0bGUgPSAiIiwKICAgICAgIHNpemUgPSAiTnVtYmVyIikKYGBgCgpgYGB7ciBkYXRhIGNpdHkgVE4gbWFwfQpnZ3Bsb3QocG9pbnRzX3RuKSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBzdGF0ZV9tYXBzX3RuLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgZmlsbCA9ICJsaWdodGdyZXkiLAogICAgYWxwaGEgPSAwLjUKICApICsKICBnZW9tX3BvaW50KGFlcygKICAgIHggPSBqaXR0ZXIobG9uKSwKICAgIHkgPSBqaXR0ZXIobGF0KSwKICAgIGNvbG9yID0gbWF4X2pvYiwKICAgIHNpemUgPSBtYXgKICApLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IgogICAgKSwKICAgIG5hbWUgPSAiSm9iIFRpdGxlIgogICkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICIiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIiKQpgYGAKCgpgYGB7ciBkYXRhIGpvYiAgYW5kIG90aGVycyBudW1iZXIgcGVyIHllYXIgaW4gVE4gfQpEQVRBICU+JQogIGZpbHRlcih3b3Jrc2l0ZV9zdGF0ZV9hYmIgPT0gIlROIikgJT4lCiAgZ3JvdXBfYnkoeWVhciwgZGF0YV9yZWxhdGlvbikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIAogIGdncGxvdChhZXMoCiAgICB4ID0geWVhciwKICAgIHkgPSBuLAogICAgZmlsbCA9IGFzLmZhY3RvcihkYXRhX3JlbGF0aW9uKQogICkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwKICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIsCiAgICAgICAgICAgYWxwaGEgPSAwLjgpICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIiMwMEIyRTQiLCAiIzBGMkE0OCIpLAogICAgbmFtZSA9ICIiLAogICAgbGFiZWxzID0gYygiRGF0YSBqb2JzIiwgIk90aGVycyIpCiAgKSArCiAgbGFicyh5ID0gIlxuIE51bWJlciIsIHggPSAiXG4gWWVhciIpICsKICAjc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4LzEwMDAsICdLJyl9KSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQpgYGA=